/******************************************************
* 文    件：spi.c
* 版    本：V2.0
* 环    境：IAR for Atmel 6.70.1
* 芯    片：ATmega系列单片机
* 时    间：2016年4月29日
* 参    考：ST公司STM32固件库及网上资源的总结
* 公    司：彪彪电子(www.aabiao.top)
* 作    者：付瑞彪(Tom Free)
*******************************************************/

#include "spi.h"
#include "gpio.h"
#include "chip.h"
#include "typedef.h"

/******************************************************
* 函 数 名：SPI_Init()
* 功    能：初始化SPI总线
* 传入参数：	mlset 数据传输方向
*         	msset 主从选择
*			modeset 模式选择
*			divset 分频因子
* 传出参数：无
* 使用举例：SPI_Init(MSB,MASTER,MODE0,DIV2);
*******************************************************/
void SPI_Init(SPI_ML_SET mlset, SPI_MS_SET msset, SPI_MODE_SET modeset, SPI_DIV_SET divset)
{
    GM_U8 temp;

    GPIO_PinInit(MOSI, GPIO_OUTPUT | GPIO_LOW);
    GPIO_PinInit(MISO, GPIO_INPUT  | GPIO_PULLUP);
    GPIO_PinInit(SCK,  GPIO_OUTPUT | GPIO_LOW);
    GPIO_PinInit(SS,   GPIO_OUTPUT | GPIO_HIGH);

    SPCR = 0X00;
    SPCR = (1 << 6) | (mlset << 5) | (msset << 4) | (modeset << 2) | (divset & 0x03);
    SPSR = 0x00;
    SPSR = (divset & 0x04) >> 2;
    temp = SPSR;
    temp = SPDR;
    temp = temp;
}

/******************************************************
* 函 数 名：SPI_SpeedSet(DIV_SET divset)
* 功    能：设置SPI总线速度
* 传入参数：	divset 分频因子
* 传出参数：无
* 使用举例：SPI_SpeedSet(DIV2);
*******************************************************/
void SPI_SpeedSet(SPI_DIV_SET divset)
{
    SPCR = (SPCR & 0xfc) | (divset & 0x03);
    SPSR = (divset & 0x04) >> 2;
}

/******************************************************
* 函 数 名：SPI_PutChar(char c)
* 功    能：SPI总线发送一个字符
* 传入参数：c 待发送字符
* 传出参数：无
* 使用举例：SPI_PutChar(0x88);
*******************************************************/
void SPI_WriteByte(char c)
{
    /* 启动数据传输 */
    SPDR = c;
    /* 等待传输结束 */
    while (!(SPSR & (1 << SPIF)));
}

/******************************************************
* 函 数 名：SPI_GetChar()
* 功    能：SPI总线接收一个字符
* 传入参数：无
* 传出参数：接收到的字符
* 使用举例：data=SPI_GetChar();
*******************************************************/
char SPI_ReadByte()
{
    SPDR = 0XFF;
    /* 等待接收结束 */
    while (!(SPSR & (1 << SPIF)));
    /* 返回数据 */
    return SPDR;
}

/*******************************************************************************
** 函数名称：SPI_RWByte
** 函数作用：读写数据
** 输入参数：data - 待写入的数据
** 输出参数：读出的数据
** 使用范例：GM_U8 res = SPI_RWByte(data);
** 函数备注：
*******************************************************************************/
GM_U8 SPI_RWByte(GM_U8 data)
{
    SPDR = data;
    /* 等待接收结束 */
    while (!(SPSR & (1 << SPIF)));
    /* 返回数据 */
    return SPDR;
}
